package main

import "fmt"

/*
new 和 make 的区别
都是用来分配内存的
make 只能用于 slice、map 和 channel 的创建，而且返回的类型是引用类型，
而 new 可以用于任意类型变量的内存分配，并且内存对应的值为类型零值，返回的时指向类型的指针
*/

type ZiDingYi = float64 // 定义类型别名  类似于using

func main() {
	var intV int // 整型变量
	var floatV float32 // 实型变量
	var boolV bool // 布尔型变量
	var stringV string // 字符串变量
	var pointerV *int // 指针变量
	var funcV func(int, int)int // function变量
	var interfaceV interface{} // 接口变量
	var sliceV []int // 切片变量
	var channelV chan int // channel变量
	var mapV map[string]string // map变量
	var errorV error // error变量

	fmt.Println("int = ", intV) // 0
	fmt.Println("float = ", floatV) // 0
	fmt.Println("bool = ", boolV) // false
	fmt.Println("string = ", stringV) // ""
	fmt.Println("pointer = ", pointerV) // nil
	fmt.Println("func = ", funcV) // nil
	fmt.Println("interface = ", interfaceV) // nil
	fmt.Println("slice = ", sliceV) // []
	fmt.Println("slice = ", sliceV == nil) // true
	fmt.Println("channel = ", channelV) // nil
	fmt.Println("map = ", mapV) // map[]
	fmt.Println("map = ", mapV == nil) // true
	fmt.Println("error = ", errorV) // nil

	var arraryV [3]int // 数组变量
	type Person struct{
		name string
		age int
	}
	var structV Person // 结构体变量
	fmt.Println("arrary = ", arraryV) // [0, 0, 0]
	fmt.Println("struct = ", structV) // {"" 0}

	var num0 int = 10
	var num1 int8 = 20
	var num2 int16
	//num2 = num0 // 编译报错, 不同长度的int之间也需要显示转换
	//num2 = num1 // 编译报错, 不同长度的int之间也需要显示转换
	num2 = int16(num0)
	num2 = int16(num1)
	fmt.Println(num2)

	var num3 float32 = 3.14
	var num4 float64
	//num4 = num3 // 编译报错, 不同长度的float之间也需要显示转换
	num4 = float64(num3)
	fmt.Println(num4)

	var num5 byte = 11
	var num6 uint8 // 这里不是隐式转换, 不报错的原因是byte的本质就是uint8
	num6 = num5
	fmt.Println(num6)

	var num7 rune = 11
	var num8 int32
	num8 = num7 // 这里不是隐式转换, 不报错的原因是byte的本质就是int32
	fmt.Println(num8)

	fmt.Println(-10 % 3) // -10 - (-10 / 3) * 3 = -10 % 3 = -1
	fmt.Println(10 % -3) // 10 - 10 / (-3) * (-3) = 10 % -3 = 1

	/*
	独立语句
  i++ 正确 ++i 错误
	i-- 正确 --i 错误
	*/

	arr := [...]int{0: 1, 1: 2, 4: 5};
	fmt.Println(arr) // [1 2 0 0 5]
	fmt.Println(len(arr)) // 5
}